Mysql UTF8 varchar与Oracle ZHS16GBK varchar2同长度下存汉字的差异 | 您所在的位置:网站首页 › varchar 字符 › Mysql UTF8 varchar与Oracle ZHS16GBK varchar2同长度下存汉字的差异 |
目录 1简介... 1 2 准备... 1 2.1 环境说明... 1 3 安装... 2 4 配置... 2 5 使用... 3 5.1 验证实验... 3 5.2 问题分析... 5 6 延展... 5 6.1 varchar2长度与字符集... 5 6.2 nvarchar2存汉字... 5 7 总结... 6 Mysql UTF8 varchar与Oracle ZHS16GBK varchar2同长度下的差异1简介基于字符集UTF8的mysql数据库下的varchar字段和字符集ZHS16GBK下oracle数据库下同长度的varchar2下的在插入数据时是有差异的,特别是在有中文字段的情况下。具体原因见下文实验以及分析。 2 准备2.1 环境说明1 mysql版本10.3.13-MariaDB,同理其它mysql版本效果类似。 -- 查看mysql版本SELECT VERSION() AS mysql_Version;mysql_Version 10.3.13-MariaDB -- mysql 字符集show variables like '%char%';Variable_name Value character_set_client utf8 character_set_connection utf8 character_set_database utf8 character_set_filesystem binary character_set_results character_set_server utf8 character_set_system utf8 character_sets_dir E:\Program Files\MariaDB 10.3\share\charsets\ 2 oracle版本为11g R2,同理其它版本效果类似。 --查看数据库版本SELECT * FROM v$version;BANNER Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production PL/SQL Release 11.2.0.4.0 - Production "CORE 11.2.0.4.0 Production" TNS for Linux: Version 11.2.0.4.0 - Production NLSRTL Version 11.2.0.4.0 - Production --查看字符集SELECT * FROM v$nls_parameters where parameter='NLS_CHARACTERSET';PARAMETER VALUE NLS_CHARACTERSET ZHS16GBK 3无. 4 配置无 5 使用5.1 验证实验1) mysql里创建一个demo表定义id和长度为6的name字段,插入中文数据验证,这里最大的插入长度为6. CREATE TABLE demo(id int,name varchar(6),PRIMARY KEY (id)) DEFAULT CHARSET=utf8;注: 如果character_set_database已经是utf8,那么这里建表时可以不加DEFAULT CHARSET=utf8.修改character_set_database参数可以在my.ini或者my.cnf里添加或者修改如下内容:[client] default-character-set=utf8 INSERT INTO demo VALUES(10,'中国');INSERT INTO demo VALUES(11,'中国安徽合肥');-- 插入失败 Data too long for column 'name' at row 1INSERT INTO demo VALUES(12,'中国安徽合肥市');INSERT INTO demo VALUES(13,'abcdef');-- 插入失败 Data too long for column 'name' at row 1INSERT INTO demo VALUES(14,'abcdefg');-- 查看字段的字节、字符长度SELECT *,length(name) byte_len,CHAR_LENGTH(name) char_len FROM demo;附图(插入异常): id name len char_len 10 中国 6 2 11 中国安徽合肥 18 6 13 abcdef 6 6 注: LENGTH(str) :Returns the length of the string str, measured in bytes.以字节为测量单位。 CHAR_LENGTH(str):Returns the length of the string str, measured in characters. 以字符为测量单位。 2) 同理在oracle里创建一个demo表定义id和长度为6的name字段,插入中文数据验证,这里最大的插入长度为3(基于当前的oracle字符集环境). SELECT * FROM v$version;BARNER Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production PL/SQL Release 11.2.0.4.0 - Production "CORE 11.2.0.4.0 Production" TNS for Linux: Version 11.2.0.4.0 - Production NLSRTL Version 11.2.0.4.0 – Production SELECT * FROM v$nls_parameters where parameter='NLS_CHARACTERSET';PARAMETER VALUE NLS_CHARACTERSET ZHS16GBu ID NAME BYTE_LEN CHAR_LEN 10 中国 4 2 11 中国家 6 3 13 abcdef 6 6 5.2 问题分析6 延展6.1 varchar2长度与字符集varchar2最大是4000字节(byte),查看数据库字符集的方法: select userenv('language') from dual;USERENV('LANGUAGE') SIMPLIFIED CHINESE_CHINA.ZHS16GBK 如果是ZHS16GBK即字符集是16位编码的,那么每个字符16位(bit),2字节(byte),所以最大容纳2000个汉字。如果是ZHS32GBK即字符集是32位编码的,那么每个字符32位(bit),4字节(byte),所以最大容纳1000个汉字。如果是字符集是UTF8或者AL32UTF8的,那么每个字符24位(bit),3字节(byte),所以最大容纳4000/3=1333个汉字。SELECT * FROM v$nls_parameters WHERE PARAMETER='NLS_CHARACTERSET'; PARAMETER VALUE NLS_CHARACTERSET UTF8 6.2 nvarchar2存汉字nvarchar2(6)表示该字段类型为nvarchar2,长度为6,不论英文,数字,中文都能存6个。本文基于字符集ZHS16GBK。 CREATE TABLE demo2(id int,name nvarchar2(6),PRIMARY KEY (id));INSERT INTO demo2 VALUES(10,'中国安徽合肥');---- 插入失败,提示值太大INSERT INTO demo2 VALUES(11,'中国安徽合肥1');INSERT INTO demo2 VALUES(12,'abcdef');---- 插入失败,提示值太大INSERT INTO demo2 VALUES(13,'abcdefg');-- 查看字段的字节、字符长度SELECT A.*,lengthb(name) byte_len,length(name) char_len FROM demo2 A;附图(插入异常): ID NAME BYTE_LEN CHAR_LEN 10 中国安徽合肥 12 6 12 abcdef 12 6 7 总结暂无.有问题可以咨询如下: |
CopyRight 2018-2019 实验室设备网 版权所有 |